【セッションレポート】 ソフトウェア開発者のためのAWS環境構築フレームワーク AWS Cloud Development Kit (CDK) 【#AWSDevDay】
セッション概要
PythonやTypeScriptなどのプログラミング言語でAWSの構成を記述・構築できるAWS CDKの仕組みや使い方、コーディング、テスト、CloudFormationとの違いについてDeepDiveしていく。
登壇者
大村 幸敬 様(アマゾン ウェブ サービス ジャパン株式会社)
AWSの環境を構築する方法
AWSの環境を構築するには様々な方法がある。
下記に手法とメリットデメリットを記述する。
マネジメントコンソール
- pros
- 始めるのが簡単
- cons
- 人間が操作を行う
- 繰り返しが可能ではない
- ヒューマンエラーが起きやすい
- 時間がかかりやすい
スクリプト(SDK、CLI)
- pros
- APIが公開されているのでそれを叩く
- シェルで書くのでプログラム言語に慣れていないくてもかける
- cons
- apiコールが失敗した場合にどう処理するか
- AWS環境のアップデートを行う場合や削除を行う場合などの定義もする必要がある
プロビジョニングツール
- あるべき状態を定義する方法
- pros
- 自動化が容易
- 再作成が可能
- 変更も記述を変えるだけで容易
- cons
- ツール固有の書き方がある
- 抽象化されておらず全て詳細に記述する必要がある
Document Object Models
- あるべき状態の定義意をコードで記載する
- コードを元にCloudFormationを作成する
- Troposphereなど
- pros
- プログラミング言語で記載できる
- あるべき状態を記載する
- cons
- 記述量が多くなる
AWS CDK
- 実施したいことはDocument Object Modelsで行なっているのと同じ
AWS CDKとは
- AWS環境をプログラミング言語で記述できる
- 制御構文の他、クラスや継承などの抽象化の概念が使える
- エディタによる型チェックやサジェスト、API仕様の参照が可能
- AWSのベストプラクティスが定義されたライブラリを元にAWS環境を容易に
- 少ないコード量で抽象化されたライブラリを使用してAWSリソースを作れる
- 複数スタック間の依存関係が記述できる
- CloudFormationではクロススタックを使用した場合に依存関係の管理が大変になりやすいがそれを防ぎやすい
- バックエンドがCloudFormationである
- OSSなのでPull Requestを投げたりできる
- CDK(Command Line Tool)自体はNode.jsで動く
- 開発言語は下記の言語を使用できる
- TypeSciprt
- Python
- Java 8 and Maven(Developer Preview)
- C#(Developer Preview)
CDKからみたCloudFormationの位置付け
- CDKを使った場合でも最終的なデプロイはCloudFomraitonで行われる
- CDKのコンパイルが発生したとしてもCloudFormation側でエラーが起きる可能性もある
- 現行の資産やSAMの活用をしたい場合にはCloudFormationが便利な場合もある
jsii
- JavaScriptで書かれたクラスに他の言語からアクセスするためのライブラリ
- AWS CDKを各言語で使用できるようにするために開発したOSSライブラリ
- TypeScriptで実装されたCDKをPythonなどの他言語に自動で反映させる
- 開発やビルドツールの使用を想定しているのでパフォーマンスは限定的
How to use AWS CDK
AWS CDKを使用するためには下記のようなステップで行なっていく。
環境の事前準備
- 下記ツールをインストール
- AWS CLI
- Node.js(8系以降)
- AWS CDKの導入
$ npm i -g aws-cdk
- cdk initの実行
$ cdk init
CDKのデプロイ
- cdkデプロイ管理用環境(S3バケット)の作成
- アカウントのリージョン毎に1回のみ実行する
$ cdk bootstrap
- ビルドとCloudFormationテンプレートの生成
$ npm run build $ cdk synth mystack
- デプロイ
$ cdk deploy mystack
CDKのコンセプト
- App
- 最上位に当たる要素
- CLoudFormationテンプレートの生成とデプロイに利用する
- 複数のStackとその依存関係を定義する
- Stack
- デプロイ可能な最小単位
- CloudFormation Stackに該当する
- リージョンとアカウント情報を保持する
- Construct
- Satckに作成するAWSリソース
- AWS Construct Libraryを提供している
- 独自での定義することも可能
Construct
- AWS CDKアプリの基本ビルディングブロック
- Cloudコンポーネントを表し、CloudFormaitonがリソースを作成するために必要なカプセル化する
- 単一のリソースを表すことも複数のAWSリソースをまたがるハイレベルコンポーネントを表すこともできる
Construct Libraryのレベル
AWS CDKが標準で提供するライブラリがどのように分類されるかについて
- High Level Constructs
- デフォルト値や便利なメソッドを定義したAWSリソースを表すクラス(s3.Bucket.addLifecycleRule()...など)
- Low Lvel Constructs
- CloudFormationリソースおよびプロパティと1:1で対応(自動生成される)
- CFnXXXという名前(s3.CfnBucketはAWS::S3::Bucketを意味する)
- 全てのプロパティを明示的に指定する必要がある
- Patterns
- 複数のリソースを含む一般的な構成パターンを事前に定義したもの(aws-ecs-patterns.LoadBalancerFargateServiceなど)
CDK DiveDeep
CDKのテストコード
- AWSのブログでどのようにテストを行うかの指針が記述されている
- ブログによるとCDKのテストは3つに分かれる
- Snapshot tests
- あるべきCloudFormationテンプレート全体を用意し、CDKで作成したテンプレートが一致することを確認する
- CDKの開発では「Integration test」としてjestで実装されている
- Fine-grained assertions
- CDKで作成したテンプレートの一部をチェックして指定したリソースが特定のプロパティを持つことを確認する
- Validation tests
- Constructに与えられたパラメータが正しいことを検証する一般的なユニットテスト
- Snapshot tests
- テストコードには
@aws-cdk/assets
ライブラリを使用する- デベロッパープレビューの状態なので注意が必要
CDK複数スタックの管理
- Appの元にStackを追加していく
- 明示的に依存順序を定義したい場合は、
addDependency
メソッドを使用する
- 明示的に依存順序を定義したい場合は、
CDK アクセス許可の与え方
- S3やDynamoDBなどアクセス対象となるConsttructはアクセス許可を与えるために
grant
から始まるメソッドを保持する- grandRead()、grantWrite()などがある
- 引数に権限を与えたいオブジェクトを与える
- IGrantableインタフェースを実装したオブジェクトを渡すことで適切なIAM ロールやポリシーが設定される
- grandRead()、grantWrite()などがある
CDKで使用できるパラメータ
- Environment
- CDKコマンドを実行するシェルの環境変数
- 既存環境の情報をAWS CLIを使って参照する場合などに必要
- process.env.XXXのようにアクセスできる
- Context
- CDKコードを実行する際の周囲の環境を定義
- VPC IDや、Dev/Prodなどを渡すことができる
- cdk.jsonファイルやコマンドライン引数で渡せる
- CDKコードを実行する際の周囲の環境を定義
- SSM ParameterStore
- AWS上で構成情報を保持するパラメータストア
- CDKとはライフサイクルが異なる
情報源
- CDK ワークショップで実際に体験することができる
- AWS InnovateでPythonバージョンの話が今後聞くことができる